package dao

import (
	kinit "longblog/work/base/initialize"

	jgorm "github.com/jinzhu/gorm"
)

func init() {

}

type DataBlockIntFloatstring struct {
	StrData     string  `gorm:"column:str_data"`
	Int64Data   int64   `gorm:"column:int64_data"`
	Float64Data float64 `gorm:"column:float64_data"`
}

/*
--
--
--
--
*/

func GetOneData(tx *jgorm.DB, sql string, valuesx ...interface{}) DataBlockIntFloatstring {
	if tx == nil {
		tx = kinit.Gorm
	}
	var obj DataBlockIntFloatstring
	tx.Raw(sql, valuesx...).Scan(&obj)
	return obj
}

//同样的sql因为where不同导致有时候是string,有时候是int64，诡异
//可以使用github.com/gogf/gf/util/gconv对此转换
func ScanOnce(tx *jgorm.DB, sql string, valuesx ...interface{}) map[string]interface{} {

	records := Scans(tx, sql, valuesx...)
	if len(records) > 0 {
		return records[0]
	}

	return make(map[string]interface{})
}

//同样的sql因为where不同导致有时候是string,有时候是int64，诡异
//可以使用github.com/gogf/gf/util/gconv对此转换
func Scans(tx *jgorm.DB, sql string, valuesx ...interface{}) []map[string]interface{} {
	if tx == nil {
		tx = kinit.Gorm
	}
	records := make([]map[string]interface{}, 0)

	rows, err := tx.Raw(sql, valuesx...).Rows()
	if err != nil {
		kinit.LogError.Println(err)
		return records
	}
	defer rows.Close()

	columns, err := rows.Columns()
	if err != nil {
		kinit.LogError.Println(err)
		return records
	}

	count := len(columns)
	values := make([]interface{}, count)
	scanArgs := make([]interface{}, count)

	for rows.Next() {
		for i := 0; i < count; i++ {
			scanArgs[i] = &values[i]
		}
		err := rows.Scan(scanArgs...)
		if err != nil {
			kinit.LogError.Println(err)
			return records
		}

		entry := make(map[string]interface{})
		for i, col := range columns {
			v := values[i]

			b, ok := v.([]byte)
			if ok {
				entry[col] = string(b)
			} else {
				entry[col] = v
			}

			// switch x := v.(type) {
			// case []byte:
			// 	kinit.LogError.Println("[]byte", v)
			// case string:
			// 	kinit.LogError.Println("string", v)
			// case bool:
			// 	kinit.LogError.Println("bool", v)
			// case int:
			// 	kinit.LogError.Println("int", v)
			// case int32:
			// 	kinit.LogError.Println("int32", v)
			// case int64:
			// 	kinit.LogError.Println("int64", v)
			// case float32:
			// 	kinit.LogError.Println("float32", v)
			// case float64:
			// 	kinit.LogError.Println("float64", v)
			// default:
			// 	kinit.LogError.Println("default", v, x)
			// }

		}
		records = append(records, entry)
	}

	return records
}
